package com.zengqingfa.springboot.redis.service.impl;

import com.zengqingfa.springboot.redis.service.RedisRankService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Service;

import java.util.Set;

/**
 * @author zengqingfa
 * @className RedisRankServiceImpl
 * @description
 * @create 2022/9/21 22:55
 */
@Service
public class RedisRankServiceImpl implements RedisRankService {
    @Autowired
    private StringRedisTemplate redisTemplate;

    public static final String SEARCH_HOT_WORD = "user:searchHotWord";

    /**
     * 使用Sorted Set记录keyword
     * zincrby命令，对于一个Sorted Set，存在的就把分数加x(x可自行设定)，不存在就创建一个分数为1的成员
     *
     * @param keyword 搜索关键词
     */
    @Override
    public void searchZincrby(String keyword) {
        // 名为sortedSetName的Sorted Set不用预先创建，不存在会自动创建，存在则向里添加数据
        String sortedSetName = SEARCH_HOT_WORD;
        // x 的含义请见本方法的注释
        double x = 1.0;
        redisTemplate.opsForZSet().incrementScore(SEARCH_HOT_WORD, keyword, x);
        //TODO 根据keyword查询业务
    }

    /**
     * zrevrange命令, 查询Sorted Set中指定范围的值
     * 返回的有序集合中，score大的在前面
     * zrevrange方法无需担心用于指定范围的start和end出现越界报错问题。
     *
     * @param start 查询范围开始位置 从0开始
     * @param end   查询范围结束位置
     * @return
     */
    @Override
    public Set<ZSetOperations.TypedTuple<String>> queryTopSearchHotWord(Integer start, Integer end) {
        String sortedSetName = SEARCH_HOT_WORD;
        Set<ZSetOperations.TypedTuple<String>> resultSet = redisTemplate.opsForZSet().reverseRangeWithScores(sortedSetName, start, end);
        return resultSet;
    }

    /**
     * 删除指定的key
     *
     * @param keyName keyName
     */
    @Override
    public void deleteKey(String keyName) {
        redisTemplate.delete(keyName);
    }

}